package com.duoduo.数组;

/**
 * @program: algorithm
 * @description: 旋转图像48
 * 给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
 * <p>
 * 你必须在 原地 旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
 * <p>
 * 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
 * 输出：[[7,4,1],[8,5,2],[9,6,3]]
 * @author: chaidl  ！
 * @create: 2022-05-08 21:12
 */
public class 旋转图像48 {
	public void rotate(int[][] matrix) {
		if (matrix.length == 0 || matrix.length != matrix[0].length) {
			return;
		}
		//先从右上角到左下角进行旋转
		int length = matrix.length - 1;
		for (int x = 0; x <= length; x++) {
			for (int y = 0; y <= length - x; y++) {
				//	先拿出左上角第一个 （0，1）->(1,2)
				int tmp = matrix[x][y];
				matrix[x][y] = matrix[length - y][length - x];
				matrix[length - y][length - x] = tmp;
			}
		}
		//	再沿着水平中线进行反转
		for (int i = 0; i <= (length >> 1); i++) {
			for (int j = 0; j <= length; j++) {
				int tmp = matrix[i][j];
				matrix[i][j] = matrix[length - i][j];
				matrix[length - i][j] = tmp;
			}
		}
	}
	
	/**
	 * 采用这种方法更容易理解
	 * @param matrix
	 */
	public void rotate2(int[][] matrix) {
		int n = matrix.length;
		// 水平翻转
		for (int i = 0; i < n / 2; ++i) {
			for (int j = 0; j < n; ++j) {
				int temp = matrix[i][j];
				matrix[i][j] = matrix[n - i - 1][j];
				matrix[n - i - 1][j] = temp;
			}
		}
		// 主对角线翻转
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j < i; ++j) {
				int temp = matrix[i][j];
				matrix[i][j] = matrix[j][i];
				matrix[j][i] = temp;
			}
		}
	}
	

}
